package com.zmn.plat.business.interfaces.product;

import com.zmn.plat.common.dto.product.*;
import com.zmn.plat.common.dto.product.base.ProductBaseDRO;
import com.zmn.plat.common.dto.product.picture.ProductGuaranteeDRO;
import com.zmn.plat.common.dto.product.picture.ServProductPictureDRO;
import com.zmn.plat.common.dto.product.price.ProductPriceDRO;
import com.zmn.plat.common.exception.PlatException;
import com.zmn.plat.model.entity.area.BaseArea;
import com.zmn.plat.model.entity.product.ServProduct;
import com.zmn.plat.model.vo.product.tariff.item.price.ProductServiceItemExcutePriceResultVo;

import java.util.List;

/**
 * 描述:产品BService
 *
 * @author tanghongjun
 * @since: 2020年3月24日10:49:16
 */
public interface ProductBService {

    /**
     * 描述: 根据渠道城市产品以及保内保外，确定产品是否支持计价器
     *
     * @param channelId 渠道ID
     * @param cityId    城市ID
     * @param productId 产品ID
     * @param type      保内保外
     * @return Boolean true 支持 false 不支持
     * @since 2020年4月13日15:54:34
     */
    Boolean checkTraiffByChannelAndCityAndProductAndType(Integer channelId, Integer cityId, Integer productId, Integer type) throws PlatException;

    /**
     * 描述: 根据入参（详细信息请查看ProductDIO）查询产品列表信息 参数说明，如果传入了单个产品ID，则直接根据产品ID查询相关基本信息，不过滤关键字，渠道，分类信息，产品ID集合等信息
     * 如果没有传入产品ID集合，则直接，则直接根据产品ID集合查询相关基本信息，不过滤关键字，渠道，分类信息
     *
     * @param productDIO 基本产品查询入参
     * @return List《ProductAllMsgInfoDRO》
     * @auther tanghongjun
     * @since 2020/3/24 10:50
     */
    List<ProductAllMsgInfoDRO> listByDIO(ProductDIO productDIO) throws PlatException;

    /**
     * 同com.zmn.plat.business.interfaces.product.ProductBService#listByDIO(com.zmn.plat.common.dto.product.ProductDIO)
     * 同时新增返回该产品对应的分类下的其他产品
     *
     * @param productDIO 基本产品查询入参
     * @return List《ProductAllMsgInfoDRO》
     * @auther tanghongjun
     * @since 2020/3/24 10:50
     */
    List<ProductAllMsgInfoExtDRO> listExtInfoByDIO(ProductDIO productDIO) throws PlatException;

    /**
     * 描述: 根据产品ID集合、渠道ID、城市ID、产品展示类型、产品类型、品牌ID查询产品价格信息
     *
     * @param productIdList   产品ID集合
     * @param channelId       渠道ID
     * @param cityId          城市ID
     * @param type            产品类型：1.通用产品，2.渠道产品
     * @param showType        产品展示类型：1.后台产品，2.前台产品,3.计价器产品
     * @param isTariffChannel 是否默认为计价器渠道，true表示计价器渠道，null或false表示不是默认计价器渠道
     * @param brandId         品牌ID
     * @return List《ProductPriceDRO》
     * @auther tanghongjun
     * @since 2020/3/24 14:15
     */
    List<ProductPriceDRO> listProductPriceByIdListAndChannelAndCityAndShowTypeAndTypeAndBrand(List<Integer> productIdList, Integer channelId, Integer cityId, Integer showType, Integer type,
                                                                                              Boolean isTariffChannel, Integer brandId);

    /**
     * 描述: 根据产品ID，渠道ID，城市信息，产品展示类型，保内保外，是否默认支持计价器，品牌ID获取产品价格信息
     *
     * @param productId       产品ID
     * @param channelId       渠道ID
     * @param baseArea        城市信息
     * @param showType        产品展示类型:1.后台，2.前台，3.计价器
     * @param type            1保外，2.保内
     * @param isTariffChannel 是否默认支持计价器渠道
     * @param brandId         品牌ID
     * @return ProductPriceDRO 产品价格信息
     * @auther tanghongjun
     * @since 2020/3/28 14:51
     */
    ProductPriceDRO getProductPriceByIdAndChannelAndCityAndShowTypeAndTypeAndBrand(Integer productId, Integer channelId, BaseArea baseArea, Integer showType, Integer type, Boolean isTariffChannel,
                                                                                   Integer brandId);


    /**
     * 描述: 根据前台产品id获取对应的二级分类下的默认前台产品
     *
     * @param dio 前台产品ID
     * @return ShowProductDefaultSimpleDRO 默认产品简单信息
     * @auther tanbiao
     * @since 20201/3/24 14:51
     */
    List<ShowProductDefaultSimpleDRO> listDefaultShowProductsByShowProductIds(ShowProductDefaultSimpleDIO dio);

    /**
     * 描述: 获取产品默认服务项
     *
     * @param tariffType  价格表类型
     * @param servProduct 产品
     * @param showType    产品展示类型:1.后台，2.前台，3.计价器
     * @param channelId   渠道ID
     * @param type        1保外，2.保内
     * @param brandId     品牌ID
     * @param cityId      城市ID
     * @return ProductServiceItemExcutePriceResultVo 默认服务项以及其价格信息
     * @auther tanghongjun
     * @since 2020/3/28 14:55
     */
    ProductServiceItemExcutePriceResultVo getDaultPriceItem(Integer tariffType, ServProduct servProduct, Integer showType, Integer channelId, Integer type, Integer brandId, Integer cityId);

    /**
     * 描述: 根据产品ID集合查询产品保障信息
     *
     * @param productIdList 产品ID集合
     * @return List《ProductGuaranteeDRO》
     * @auther tanghongjun
     * @since 2020/3/24 14:18
     */
    List<ProductGuaranteeDRO> listProductGuaranteeByIdList(List<Integer> productIdList);

    /**
     * 描述: 根据产品ID集合查询产品图片信息
     *
     * @param productIdList 产品ID集合
     * @return List《ServProductPictureDRO》
     * @auther tanghongjun
     * @since 2020/3/24 14:19
     */
    List<ServProductPictureDRO> listProductPictureByIdList(List<Integer> productIdList);

    /**
     * 描述: 根据产品类型、服务分类ID，产品二级分类ID，产品状态，查询可用产品（工单可用） 可用：如果是查询前台产品，则其关联后台产品必须有一个是上架状态 如果是查询后台产品，则其对应的前台产品必须是上架状态 如果是查询计价器产品，则其关联的后台产品必须有一个是上架状态
     *
     * @param showType    产品展示类型：1.后台，2.前台，3.计价器
     * @param servCategId 服务分类ID
     * @param categTwoId  产品二级分类ID
     * @param status      产品状态
     * @return List《ProductBaseDRO》
     * @since 2020年4月2日11:26:33
     */
    List<ProductBaseDRO> listByShowTypeAndServCategAndCategAndStatus(Integer showType, Integer servCategId, Integer categTwoId, Integer status) throws PlatException;

    /**
     * 描述: 根据入参（详细信息请查看ProductDIO）查询产品列表信息 参数说明，如果传入了单个产品ID，则直接根据产品ID查询相关基本信息，不过滤关键字，渠道，分类信息，产品ID集合等信息
     * 如果没有传入产品ID集合，则直接，则直接根据产品ID集合查询相关基本信息，不过滤关键字，渠道，分类信息
     *
     * @param productDIO 基本产品查询入参
     * @return List《ProductBaseDRO》
     * @auther tanghongjun
     * @see ProductDetailsBService#listBaseDROByDIO(com.zmn.plat.common.dto.product.ProductDIO) 对应新接口
     * @since 2020/3/24 10:50
     */
    @Deprecated
    List<ProductBaseDRO> listBaseDROByDIO(ProductDIO productDIO);

    /**
     * 描述: 根据产品ID和产品类型判断产品是否支持一口价 如果是前台产品，则判断是否有关联的后台产品开通计价器，并且开通计价器的后台产品是否有关联上架的计价器产品，并且是否有可用的计价器价格表
     * 如果是后台产品，则查询是否开通计价器状态，并且有对应开通上架的计价器产品，并且有对应的开通的前台产品，并且是否有可用的计价器价格表
     * 如果是计价器产品，则查询是否上架，其对应的后台产品是有否开通计价器状态的后台产品，开通后台计价器状态的后台产品是否有上架的前台产品，开通计价器状态的后台产品是否有可用的计价器价格表
     *
     * @param productId 产品ID
     * @param channelId 渠道ID
     * @param showType  产品类型：1.后台产品，2.前台产品，3.计价器产品
     * @param bizType   保内/保外/工程 1.保外 2.保内 3.工程
     * @return true 支持计价器 false 不支持计价器
     * @auther tanghongjun
     * @since 2020/3/26 14:58
     */
    Boolean checkTariffByProductIdAndShowType(Integer productId, Integer channelId, Integer showType, Integer bizType);

    /**
     * 如果支持计价器，判断是否计价器产品属性： 如果是前台产品，则判断是否有关联的后台产品开通计价器，并且开通计价器的后台产品是否有关联上架的计价器产品，并且是否有可用的计价器价格表
     * 如果是后台产品，则查询是否开通计价器状态，并且有对应开通上架的计价器产品，并且有对应的开通的前台产品，并且是否有可用的计价器价格表
     * 如果是计价器产品，则查询是否上架，其对应的后台产品是有否开通计价器状态的后台产品，开通后台计价器状态的后台产品是否有上架的前台产品，开通计价器状态的后台产品是否有可用的计价器价格表
     *
     * @param channelId 渠道ID
     * @param product   产品
     * @param showType  产品类型：1.后台产品，2.前台产品，3.计价器产品
     * @param bizType   保内/保外/工程 1.保外 2.保内 3.工程
     * @return true 支持计价器 false 不支持计价器
     * @auther tanghongjun
     * @since 2020/3/26 14:58
     */
    Boolean checkTariffByProductIdAndShowType(ServProduct product, Integer channelId, Integer showType, Integer bizType);

    /**
     * 描述: 根据查询条件分页查询产品列表信息 特别注意ServProductDIO中新增的 productType参数的说明
     *
     * @param query
     * @return: List<FaultProductDRO>
     * @auther: tanghongjun
     * @since: 2018/10/23 11:12
     */
    List<ProductBaseDRO> listProductPageByDio(ProductDIO query);

    /**
     * 描述: 根据渠道ID和产品基本信息分页查询渠道开通产品
     *
     * @param channelId      渠道ID
     * @param servProductDIO 产品查询条件
     * @return 产品集合
     * @auther tanghongjun
     * @since 2019/9/7 11:29
     */
    List<ProductBaseDRO> listByChannelIdAndProductDIO(Integer channelId, ProductDIO servProductDIO);

    /**
     * 描述: 根据查询条件查询复合条件的产品数
     *
     * @param query
     * @return
     * @auther tanghongjun
     * @since 2019/8/15 14:44
     */
    Integer countByDio(ProductDIO query);

    /**
     * 描述: 根据渠道ID和产品基本信息分页查询渠道开通产品条数
     *
     * @param channelId      渠道ID
     * @param servProductDIO 产品查询条件
     * @return 产品集合
     * @auther tanghongjun
     * @since 2019/9/7 11:29
     */
    Integer countByChannelIdAndProductDIO(Integer channelId, ProductDIO servProductDIO);

    /**
     * 描述：定渠道Id和城市Id与给定商品Id进行筛选
     *
     * @param dio 渠道城市产品Id集合
     * @return 产品集合
     * @auther liuyong
     * @since 20201/4/22 16:20
     */
    List<Integer> getShowProductIds(ShowProductDefaultSimpleDIO dio);
}
